home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fatted Calf
/
The Fatted Calf.iso
/
Applications
/
Communication
/
Gazetteer
/
Source
/
Storm.m
< prev
next >
Wrap
Text File
|
1994-05-23
|
8KB
|
368 lines
/*
* Object to peck on a remote network weather service.
*
* Michael Hawley
* MIT Media Laboratory
* 20 Ames Street
* Cambridge, MA 02139
* mike@media-lab.mit.edu
* Copyright (c) 1991 MIT Media Laboratory
* Burn before reading! This means you!!
*
* Please forward any comments/revisions.
* Keep in mind that this was a one-day knock off;
* much of the complexity is due to the fact that
* we have to parse a telnet conversation that was
* never intended for such.
*/
#import "Storm.h"
#import "Process.h"
#import <appkit/appkit.h>
#import "DefaultHandler.h"
#import "util.h"
@implementation Storm
int StormDebug = 1;
id _status;
id _defaults;
id _PutHere;
extern setState(), ReadState(), runState(), access(),
getReport(), sleep(), execState();
char *
path(char *s)
/*
* if 's' is in [NXArgv[0]], return [NXArgv[0]]/s.
* (for looking up internal commands and files in .../Opener.app/...).
*/
{
char t[1024], *q, *r;
static char p[1024];
extern char **NXArgv;
*t = '\0';
sscanf(s,"%s",t);
if (!*t || *t=='(') return s;
r = s + strlen(t);
strcpy(p,*NXArgv);
if (q=rindex(p,'/'))
strcpy(q+1,t);
else
strcpy(p,t);
if (access(p,0)==0){
strcpy(p+strlen(p),r);
return p;
}
return s;
}
static void say(s, a,b,c,d) id s; char *a,*b,*c,*d; {
char p[1024];
sprintf(p,a,b,c,d);
[s setStringValue:p];
[s display];
NXPing();
}
void message(a,b,c,d) char *a,*b,*c,*d; {
say(_status,a,b,c,d);
}
static int eq(char *a, char *b){ return strncmp(a,b,strlen(b))==0; }
static void put(P, fmt, a, b, c, d) id P; char *fmt, *a, *b, *c, *d; {
char p[1024];
sprintf(p,fmt,a,b,c,d);
if (Verbose) printf("+ %s\n",p);
[P puts:p];
}
void Put(fmt, a, b, c, d) char *fmt, *a, *b, *c, *d; {
put(_PutHere,fmt,a,b,c,d);
}
static char *
get(P, s, n) id P; char *s; int n; {
[P gets:s:n];
if (*s && Verbose) printf("> %s",s);
return *s? s : (char *)0;
}
char *
pgets(s,n) char *s; int n; {
[_PutHere gets:s:n];
return *s? s : (char *)0;
}
/* #ifdef 0
static char *
flush(P,s) id P; char *s; {
static char t[1024];
while (get(P,t,sizeof t))
if (strindex(t,s)) return t;
sleep(1);
while (get(P,t,sizeof t))
if (strindex(t,s)) return t;
return (char *)0;
}
#endif
*/
char *
Flush(s) char *s; {
static char t[1024];
if (_PutHere) return (char *)0;
while (get(_PutHere,t,sizeof t))
if (strindex(t,s)) return t;
sleep(1);
while (get(_PutHere,t,sizeof t))
if (strindex(t,s)) return t;
return (char *)0;
}
- enable:(BOOL)b {
[attachB setIcon:b? "plug" : "unplug"];
return self;
}
static id _text, _scroll;
- initMatrix {
// from the nib file, we have the help text; keep a pointer to it.
_text = helpText = [scrollView docView];
[_text setDelegate:self];
[_text setMarginLeft:6.0 right:6.0 top:0.0 bottom:0.0];
[_text notifyAncestorWhenFrameChanged:YES];
return self;
}
- setScrollView:anObject {
_scroll = scrollView = anObject;
[self initMatrix];
return self;
}
extern char DefaultFont[];
extern char DefaultFontSize[];
static id fid = (id)0;
static int canconvert = 0;
// double atof();
- textWillConvert:textObject fromFont:from toFont:to {
if (canconvert && strcmp(DefaultFont,[from name])==0 &&
atof(DefaultFontSize) == [from pointSize]){
strcpy(DefaultFont,[to name]);
sprintf(DefaultFontSize,"%f",[to pointSize]);
fid = to;
[_defaults writeDefaults:self];
}
return to;
}
void
setText(s) char *s; {
static NXPoint origin = {0.0,0.0};
char *p = index(s,'\n')+1; /* skip past first (blank) line */
id w = [_scroll window];
if (!fid){
fid = [Font newFont:DefaultFont size:atof(DefaultFontSize)];
}
canconvert=0;
[w disableFlushWindow];
[_text setText:s];
[_text setSel:p-s:strlen(s)];
[_text setSelGray:0.0];
[_text setSelFont:fid];
[_text selectNull];
[_text scrollPoint:&origin];
[_scroll display];
[[w reenableFlushWindow] flushWindow];
canconvert=1;
}
void
setFile(s) char *s; {
NXStream *f = NXMapFile(path(s),NX_READONLY);
static NXPoint origin = {0.0,0.0};
id w = [_scroll window];
canconvert=0;
s = path(s);
if (!f) return ;
[w disableFlushWindow];
[_text setMonoFont:NO];
[_text readRichText:f];
[_text scrollPoint:&origin];
NXCloseMemory(f,NX_FREEBUFFER);
[_scroll display];
[[w reenableFlushWindow] flushWindow];
}
- showHelp:sender {
setFile("info");
return self;
}
#define Case break; case
void
squishRtn(char *s){
char *p = s;
while (*p = *s++)
if (*p != '\r') ++p;
}
static char *
getLine(char *s, char *t){ /* read ...\n from s into t; return new s */
char *p = t;
*t = '\0';
squishRtn(s);
while (*s && *s != '\n') *p++ = *s++;
if (*s == '\n') *p++ = *s++;
*p++ = '\0';
if (*t == '\0') return (char *)0;
if (Verbose) printf("- %s",t);
return s;
}
- processOutput:(char *)s {
static char prev[8192]="";
char t[1024], *p=prev;
strcat(prev,s); s = t;
while ((p=getLine(p,s)) &&
(index(s,'\n') || strcmp(s+strlen(s)-2,": ")==0))
execState(0,s);
strcpy(prev,blank(s)?s:"");
return self;
}
- hitFormat:sender {
extern setFormat();
char *s = (char *)[[sender selectedCell] title];
setFormat(s);
return self;
}
- query:sender {
char buf[80000];
Put("%s\n",[form stringValueAt:0]);
pgets(buf,256);
getReport(buf);
setText(buf);
Put("\n");
[form selectTextAt:0];
return self;
}
static id me;
void
Command(s) char *s; {
_PutHere = [Process new:s delegate:me];
}
- login:sender {
if (_PutHere) [_PutHere free]; P = _PutHere = (id)0;
_status = status;
ReadState(path("menus"));
[attachB setIcon:"plug"];
[form selectTextAt:0];
runState("");
return self;
}
- logout:sender {
if (P && _PutHere) setState("Detach"), runState("");
if (P) [P terminate:self];
_PutHere = P = (id)0;
[self enable:NO];
[attachB setIcon:"unplug"];
message("not connected.");
return self;
}
void
logout(){
[me logout:me];
}
- ensurelogin {
//if (!_PutHere) [self login:self];
return self;
}
int
ensurelogin(){
[me ensurelogin];
return _PutHere? 1 : 0;
}
- attach:sender {
if (eq((char *)[sender icon],"unplug")){
[self login:sender];
} else {
[self logout:sender];
}
return self;
}
/*
* telnet:
*/
- copyString:(char *)s {
id p = [Pasteboard new];
[p declareTypes:&NXAsciiPboard num:1 owner:self];
[p writeType:NXAsciiPboard data:s length:strlen(s)];
return self;
}
- launchTerminal:(char *)program {
id p = [NXApp appSpeaker];
port_t t = NXPortFromName("Terminal",NULL);
int ok;
if (t==PORT_NULL) return self;
[p setSendPort:t];
[self copyString:program];
(void)[p msgPaste:&ok];
return self;
}
- telnet:sender {
[self launchTerminal:"telnet martini.eecs.umich.edu 3000\n"];
return self;
}
- sendComments:sender {
return self;
}
+ new {
me = self = [[Storm alloc] init];
return self;
}
- free {
[self logout:self];
return [super free];
}
- appDidInit:sender {
_defaults = [DefaultHandler new];
[attachB performClick:sender];
return self;
}
- appWillTerminate:sender {
[self logout:self];
[_defaults writeDefaults:self];
return self;
}
@end